package com.ws.function1;
/*
递归方法的使用
1.递归方法：一个方法体内调用它自身
2.方法递归包含一种隐式的循环，它会重复执行某段代码，但这种重复执行无需循环控制。
  递归一定要向已知方向递归，否则这种递归就变成了无穷递归，类似于死循环
 */
public class RecursionTest {

    public static void main(String[] args) {
        //例1：计算 1-100 之间所有自然数的和
        //方式一：
//        int sum = 0;
//        for (int i = 1; i < 101; i++) {
//            sum += i;
//        }
//        System.out.println(sum);

        //方式二：
        RecursionTest test = new RecursionTest();
        int sum = test.getSum(100);
        System.out.println(sum);

        int product = test.getProduct(4);
        System.out.println(product);

        int f = test.f(10);
        System.out.println(f);

        int fibonacci = test.Fibonacci(10);
        System.out.println(fibonacci);
        System.out.println(test.count);
    }

    public int getSum(int n) {
        if (n == 1) {
            return 1;
        } else {
            return n + getSum(n - 1);
        }
    }

    //计算 1-n 之间所有自然数的乘积
    public int getProduct(int n) {
        if (n == 1) {
            return 1;
        } else {
            return n * getProduct(n - 1);
        }
    }

    //例3:已知有一个数列:f(0) = 1,f(1) = 4,f(n+2)=2*f(n+1) + f(n)
    // 其中n是大于0的整数，求f(10)的值。
    int count = 0;
    public int f(int n) {
        count ++;
        if (n == 0) {
            return 1;
        } else if (n == 1) {
            return 4;
        } else {
//            return f(n + 2) - 2 * f(n + 1);
            return 2 * f(n - 1) + f(n - 2);
        }
    }

    //例4：输入一个数据 n，计算斐波那契数列的第 n 个值
    //规律：一个数等于前两个数之和
    public int Fibonacci(int n) {
        if (n == 1 || n == 2) {
            return 1;
        } else {
            return Fibonacci(n - 1) + Fibonacci(n - 2);
        }
    }

    //例5：汉诺塔问题



}
